import * as Cesium from "cesium";

export default class RainEffect {
   // 修正后的下雨效果代码
  constructor() {
    this.stage = null;  // 雨滴的粒子效果
  }

  init(viewer) {
    this.stage = new Cesium.PostProcessStage({
      name: 'czm_rain', // 雨滴的粒子效果名称
      fragmentShader: `
        uniform sampler2D colorTexture;
        uniform float speed;
        uniform float size;
        in vec2 v_textureCoordinates;
        out vec4 fragColor;

        float hash(float x) { return fract(sin(x*133.3)*13.13); }

        void main(void) {
          float time = czm_frameNumber / speed;
          vec2 uv = (gl_FragCoord.xy * 2.0 - czm_viewport.zw) / min(czm_viewport.z, czm_viewport.w);
          vec3 col = vec3(0.6,0.7,0.8);
          float a = -0.6;
          float si = sin(a), co = cos(a);
          uv *= mat2(co, -si, si, co);
          uv *= length(uv + vec2(0,4.9)) * size + 1.0;
          float v = 1.0 - sin(hash(floor(uv.x*100.0))*2.0);
          float b = clamp(abs(sin(20.0*time*v + uv.y*(5.0/(2.0+v))))-0.95,0.0,1.0)*20.0;
          col *= v*b;
          fragColor = mix(texture(colorTexture, v_textureCoordinates), vec4(col,1.0), 0.5);
        }
      `,
      uniforms: {
        speed: 60.0,  // 雨滴的速度
        size: 0.3  // 雨滴的大小
      }
    });
    viewer.scene.postProcessStages.add(this.stage); // 添加雨滴的粒子效果到场景中
  }

  show(visible) {
    if(this.stage) this.stage.enabled = visible;  // 显示或隐藏雨滴的粒子效果
  }
}

// 使用方式（在viewer初始化完成后调用）
// const rainEffect = new RainEffect();  // 创建RainEffect实例
// rainEffect.init(viewer);  // 初始化雨效果
// rainEffect.show(true); // 显示雨效果
